home *** CD-ROM | disk | FTP | other *** search
- ;;; -*- Mode: Lisp; Package: Maxima; Syntax: Common-Lisp; Base: 10 -*- ;;;;
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
- ;;; The data in this file contains enhancments. ;;;;;
- ;;; ;;;;;
- ;;; Copyright (c) 1984,1987 by William Schelter,University of Texas ;;;;;
- ;;; All rights reserved ;;;;;
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
- ;;; (c) Copyright 1981 Massachusetts Institute of Technology ;;;
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-
- (in-package "MAXIMA")
- ;;; Interpolation routine by CFFK.
- (macsyma-module intpol)
- (load-macsyma-macros transm numerm)
-
- (declare-top (special $intpolrel $intpolabs $intpolerror)
- (flonum $intpolrel $intpolabs a b c fa fb fc)
- (fixnum lin)
- (notype (interpolate-check flonum flonum flonum flonum)))
-
- (COMMENT | For historical information ONLY. |
- (defun fmeval2 (x)
- (cond ((integerp (setq x (meval x))) (float x))
- ((floatp x) x)
- (t (displa x) (MAXIMA-ERROR '|not floating point|))))
- (defun qeval (y x z) (cond (x (fmeval2 (list '($ev) y (list '(mequal) x z) '$numer)))
- (t (funcall y z))))
- )
-
- (or (boundp '$intpolabs) (setq $intpolabs 0.0))
- (or (boundp '$intpolrel) (setq $intpolrel 0.0))
- (or (boundp '$intpolerror) (setq $intpolerror t))
-
- (Defun $interpolate_SUBR (F LEFT RIGHT)
- (BIND-TRAMP1$
- F F
- (prog (a b c fa fb fc (lin 0))
- (declare (flonum a b c fa fb fc) (fixnum lin))
- (setq A (FLOAT LEFT)
- B (FLOAT RIGHT))
- (or (> b a) (setq a (prog2 niL b (setq b a))))
- (setq fa (FCALL$ f a)
- fb (FCALL$ f b))
- (or (> (abs fa) $intpolabs) (return a))
- (or (> (abs fb) $intpolabs) (return b))
- (and (> (*$ fa fb) 0.0)
- (cond ((eq $intpolerror t)
- (merror "function has same sign at endpoints~%~M"
- `((mlist)
- ((mequal) ((f) ,a) ,fa)
- ((mequal) ((f) ,b) ,fb))))
- (t (return $intpolerror))))
- (and (> fa 0.0)
- (setq fa (prog2 nil fb (setq fb fa)) a (prog2 nil b (setq b a))))
- (setq lin 0.)
- binary
- (setq c (//$ (+$ a b) 2.0)
- fc
- (FCALL$ f c))
- (and (interpolate-check a c b fc) (return c))
- (cond ((< (abs (-$ fc (//$ (+$ fa fb) 2.0))) (*$ 0.1 (-$ fb fa)))
- (setq lin (f1+ lin)))
- (t (setq lin 0.)))
- (cond ((> fc 0.0) (setq fb fc b c)) (t (setq fa fc a c)))
- (or (= lin 3.) (go binary))
- falsi
- (setq c (cond ((> (+$ fb fa) 0.0)
- (+$ a (*$ (-$ b a) (//$ fa (-$ fa fb)))))
- (t (+$ b (*$ (-$ a b) (//$ fb (-$ fb fa))))))
- fc (FCALL$ f c))
- (and (interpolate-check a c b fc) (return c))
- (cond ((> fc 0.0) (setq fb fc b c)) (t (setq fa fc a c)))
- (go falsi))))
-
- (defun interpolate-check (a c b fc)
- (not (and (prog2 nil (> (abs fc) $intpolabs) (setq fc (max (abs a) (abs b))))
- (> (abs (-$ b c)) (*$ $intpolrel fc))
- (> (abs (-$ c a)) (*$ $intpolrel fc)))))
-
-
-
-
- (DEFUN INTERPOLATE-MACRO (FORM TRANSLP)
- (SETQ FORM (CDR FORM))
- (COND ((= (LENGTH FORM) 3)
- (COND (TRANSLP
- `(($INTERPOLATE_SUBR) ,@FORM))
- (T
- `((MPROG) ((MLIST) ((msetq) $NUMER T))
- (($INTERPOLATE_SUBR) ,@FORM)))))
- ((= (LENGTH FORM) 4)
- (LET (((EXP VAR . BNDS) FORM))
- (SETQ EXP (SUB ($LHS EXP) ($RHS EXP)))
- (COND (TRANSLP
- `(($INTERPOLATE_SUBR)
- ((LAMBDA-I) ((MLIST) ,VAR)
- (($MODEDECLARE) ,VAR $FLOAT)
- ,EXP)
- ,@BNDS))
- (T
- `((MPROG) ((MLIST) ((msetq) $NUMER T))
- (($INTERPOLATE_SUBR)
- ((LAMBDA) ((MLIST) ,VAR) ,EXP)
- ,@BNDS))))))
- (T (merror "wrong number of args to INTERPOLATE"))))
-
- (DEFMSPEC $INTERPOLATE (FORM)
- (MEVAL (INTERPOLATE-MACRO FORM NIL)))
-
- (def-translate-property $INTERPOLATE (FORM)
- (let (($tr_numer t))
- (TRANSLATE (INTERPOLATE-MACRO FORM t))))
-
-
-